/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view;

import Simulation.Simulateur;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.*;
import model.Case;
import model.Environnement;


/**
 *
 * @author epulapp
 */
public class Graphique extends JFrame implements Observer {

    private Environnement env;
    private Simulateur simul;
    private CaseVisible[][] tabPanel;
    private JPanel jpPrinc, jpGrille, jpBut; 
    private JComboBox jcbVitesse, jcbMode,jcbModel;
    private JLabel image ;
    private Model model = new Model(1);
    private int posX = 0, posY =0;

    public int getPosX() {
        return posX;
    }

    public void setPosX(int posX) {
        this.posX = posX;
    }

    public int getPosY() {
        return posY;
    }

    public void setPosY(int posY) {
        this.posY = posY;
    }
    

    public Graphique(Environnement env, Simulateur sim) throws InterruptedException {
        super();
        this.env = env;
        this.simul = sim;
        this.posX = 0;
        this.posY = 0;
        //this.setBounds(100,100,600,400);
        this.tabPanel = new CaseVisible[env.getSizeX()][env.getSizeY()];
        this.setTitle("Le jeu de la vie");
        //this.setSize(env.getSizeX() * 20, env.getSizeY() * 20);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jpPrinc = new JPanel(new BorderLayout());
        this.setContentPane(jpPrinc);
        
        this.initialiseBut();
        this.initialiseGrille();
        this.pack();
    }

    public void initialiseBut()
    {
        jpBut = new JPanel (new FlowLayout(FlowLayout.CENTER,3,15));
        jpBut.setPreferredSize(new Dimension(170,0));
        jpPrinc.add(jpBut,BorderLayout.EAST);
        JSeparator js1 = new JSeparator();
        js1.setPreferredSize(new Dimension(140,2));
        JSeparator js2 = new JSeparator();
        js2.setPreferredSize(new Dimension(140,2));
        JSeparator js3 = new JSeparator();
        js3.setPreferredSize(new Dimension(140,2));
        
        /* Premiere liste déroulante !! */
        jcbMode = new JComboBox();
        JLabel jlMode = new JLabel("Mode :");
        
        jcbMode.addItem("Aléatoire");
        jcbMode.addItem("Personnalisé");
        jcbMode.addItem("Modèle");
        
        jpBut.add(jlMode);
        jpBut.add(jcbMode);
        jpBut.add(js1);
        
        
        /* Liste des boutons */
        JButton jbut1 = new JButton("Demarrage");
        jbut1.setPreferredSize(new Dimension(140,25));
        JButton jbut2 = new JButton("Pause");
        jbut2.setPreferredSize(new Dimension(140,25));
        JButton jbut3 = new JButton("Arret");
        jbut3.setPreferredSize(new Dimension(140,25));
        
        jbut1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                if(jcbMode.getItemAt(jcbMode.getSelectedIndex()) == "Aléatoire")
                {
                    if(simul.getEtat()==Simulateur._ETEINS_ || simul.getMode()!=Simulateur._ALEATOIRE_)
                    {
                        env.initialiser(0);
                        simul.setMode(Simulateur._ALEATOIRE_);
                    }
                    simul.play();
                }
                if(jcbMode.getItemAt(jcbMode.getSelectedIndex()) == "Personnalisé")
                {
                    if(simul.getEtat()==Simulateur._ETEINS_ || simul.getMode()!=Simulateur._PERSO_)
                    {
                        env.initialiser(1);
                        simul.setMode(Simulateur._PERSO_);
                        simul.pause();
                        JPanel fen = (JPanel) getContentPane();
                        chargeCellule(fen,false);
                        System.out.println("Etat : "+simul.getEtat()+ " || Mode : "+simul.getMode());
                    }
                    else 
                    {
                         simul.play();
                         System.out.println("Je passe dans le 2nd");
                    }
                }  
            }
        });      
 
        jbut2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                simul.pause();
            }
        });   
        
        jbut3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                simul.stopSim();
            }
        }); 
        
        jpBut.add(jbut1);
        jpBut.add(jbut2);
        jpBut.add(jbut3);
        
        
        jpBut.add(js2);
        // Liste déroulante 
        jcbVitesse = new JComboBox();
        JLabel jlVitesse = new JLabel("Vitesse :");
        jcbVitesse.addItem("Normal");
        jcbVitesse.addItem("Lent");
        jcbVitesse.addItem("Rapide");
        
        jcbVitesse.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                if(jcbVitesse.getItemAt(jcbVitesse.getSelectedIndex()) == "Normal")
                {
                    simul.changeVitesse(Simulateur._NORMAL_);
                }
                else if (jcbVitesse.getItemAt(jcbVitesse.getSelectedIndex()) == "Rapide")
                {
                    simul.changeVitesse(Simulateur._RAPIDE_);
                }
                else
                {
                    simul.changeVitesse(Simulateur._LENT_);
                }
                    
            }
        });
        jpBut.add(jlVitesse);
        jpBut.add(jcbVitesse);
        
        
        
        // Liste déroulante des modèles
        jpBut.add(js3);
        jcbModel = new JComboBox();
        JLabel jlModel = new JLabel("Model :");
        jcbModel.addItem("Simple");
        jcbModel.addItem("Croix");
        jcbModel.addItem("Planneur");
        jcbModel.addItem("Horloge");
        jcbModel.addItem("Carre");
        image = new JLabel(new ImageIcon(getClass().getResource("/images/b1.png"))); 
        jcbModel.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e) {
                if(jcbModel.getItemAt(jcbModel.getSelectedIndex()) == "Simple")
                {
                    image.setIcon(new ImageIcon(getClass().getResource("/images/b1.png")));
                    model.changeModel(1);
                }
                else if (jcbModel.getItemAt(jcbModel.getSelectedIndex()) == "Croix")
                {
                    image.setIcon(new ImageIcon(getClass().getResource("/images/b2.png")));
                    model.changeModel(3);
                }
                else if (jcbModel.getItemAt(jcbModel.getSelectedIndex()) == "Planneur")
                {
                    image.setIcon(new ImageIcon(getClass().getResource("/images/b3.png")));
                    model.changeModel(2);
                }
                else if (jcbModel.getItemAt(jcbModel.getSelectedIndex()) == "Horloge")
                {
                    //image.setIcon(new ImageIcon(getClass().getResource("/images/b4.png")));
                    model.changeModel(4);
                }
            }
            
        });
        
        
        image.setBorder(BorderFactory.createLineBorder(Color.gray));
        image.setPreferredSize(new Dimension(60, 60));
        jpBut.add(jlModel);
        jpBut.add(jcbModel);
        jpBut.add(image);
    }
    
    public void initialiseMenu()
    {
        
    }
    public void initialiseGrille() {
        //On charge le panel de la fenetre avec un layout ayant pour ta taille l'environnement
        jpGrille = new JPanel(new GridLayout(env.getSizeX(), env.getSizeY()));
        jpGrille.setPreferredSize(new Dimension(env.getSizeX()*12+15, env.getSizeY()*12+15));
        jpPrinc.add(jpGrille,BorderLayout.CENTER);
        chargeCellule(jpGrille,true);
        
            
        
    }

    public void chargeCellule(JPanel fen, boolean creation) {
        //Chargement des cases et des cellules...
        //Je charge une fois pour toute le tableau
        Case[][] temp = this.env.getTab();
        for (int i = 0; i < this.env.getSizeX(); i++) {
            for (int j = 0; j < this.env.getSizeY(); j++) {
                if (creation) {
                     CaseVisible c = new CaseVisible(temp[i][j],this);                     
                     this.tabPanel[i][j] = c;
                     fen.add(c); 
                } else {
                    this.tabPanel[i][j].testEtat();
                    this.tabPanel[i][j].refresh();
                    this.tabPanel[i][j].setModelActif(false);
                }
            }
        }
        fen.revalidate();
    }
    

    @Override
    public void update(Observable o, Object arg) {
        JPanel fen = (JPanel) getContentPane();
        chargeCellule(fen,false);
    }
    
    public void visuModel()
    {
        int[][] tab;
        tab = this.model.getTab();
        for(int i = 0;i<tab.length;i++)
        {
            for(int j=0;j<tab.length;j++)
            {
                if(tab[i][j]==1)
                {
                    if(this.posX+i < this.env.getSizeX() && this.posY+j < this.env.getSizeY())
                    {
                        this.tabPanel[this.posX+i][this.posY+j].setModelActif(true);
                    }
                }
                else
                {
                    if(this.posX+i < this.env.getSizeX() && this.posY+j < this.env.getSizeY())
                    {
                        this.tabPanel[this.posX+i][this.posY+j].setModelActif(false);
                    }
                }
            }
        }
        this.env.sendNotification();
    }
    
    public void notifyChangeEtat()
    {
        int[][] tab;
        tab = this.model.getTab();
        for(int i = 0;i<tab.length;i++)
        {
            for(int j=0;j<tab.length;j++)
            {
                if(tab[i][j]==1)
                {
                    if(this.posX+i < this.env.getSizeX() && this.posY+j < this.env.getSizeY())
                    {
                        this.tabPanel[this.posX+i][this.posY+j].getCase().changeEtat();
                    }
                }
            }
        }
    }
}
